|
Manual de referencia de Pep/8 |
Pep/8 es una Computadora con Conjunto de Instrucciones Complejas de 16 bits (CISC). Está diseñado para enseñar arquitectura de computadoras y los principios de programación en lenguaje ensamblador. Sus 39 instrucciones están basadas en un código de operación y expansión; son ya sea unario (un byte) o nonunarias (tres bytes). Los ocho modos de direccionamiento están diseñados para la traducción directa entre C/C++ y el lenguaje ensamblador.
Temas:
Conjunto de instrucciones,
Estableciendo el bit C en la resta,
Estableciendo el bit N en CPr,
Comandos de punto,
Modos de direccionamiento,
Campo del registro,
Etiquetas de seguimiento,
Resumen de la sintaxis del lenguaje ensamblador.
| Especificador de la Instrucción | Mnemotécnico | Instrucción | Modos de direccionamiento | Bits de estado |
|---|---|---|---|---|
0000 0000 | STOP | Detener ejecución | U | |
0000 0001 | RETTR | Retorno de la trampa | U | |
0000 0010 | MOVSPA | Mover SP a A | U | |
0000 0011 | MOVFLGA | Mover banderas NZVC a A | U | |
0000 010a | BR | Branch unconditional | i, x | |
0000 011a | BRLE | Branch if less than or equal to | i, x | |
0000 100a | BRLT | Branch if less than | i, x | |
0000 101a | BREQ | Branch if equal to | i, x | |
0000 110a | BRNE | Branch if not equal to | i, x | |
0000 111a | BRGE | Branch if greater than or equal to | i, x | |
0001 000a | BRGT | Branch if greater than | i, x | |
0001 001a | BRV | Branch if V | i, x | |
0001 010a | BRC | Branch if C | i, x | |
0001 011a | CALL | Call subroutine | i, x | |
0001 100r | NOTr | Bitwise invert r | U | N Z |
0001 101r | NEGr | Negate r | U | N Z V |
0001 110r | ASLr | Arithmetic shift left r | U | N Z V C |
0001 111r | ASRr | Arithmetic shift right r | U | N Z C |
0010 000r | ROLr | Rotate left r | U | C |
0010 001r | RORr | Rotate right r | U | C |
0010 01nn | NOPn | Unary no operation trap | U | |
0010 1aaa | NOP | Nonunary no operation trap | i | |
0011 0aaa | DECI | Decimal input trap | d, n, s, sf, x, sx, sxf | N Z V |
0011 1aaa | DECO | Decimal output trap | i, d, n, s, sf, x, sx, sxf | |
0100 0aaa | STRO | String output trap | d, n, sf | |
0100 1aaa | CHARI | Character input | d, n, s, sf, x, sx, sxf | |
0101 0aaa | CHARO | Character output | i, d, n, s, sf, x, sx, sxf | |
0101 1nnn | RETn | Return from call with n local bytes | U | |
0110 0aaa | ADDSP | Add to stack pointer (SP) | i, d, n, s, sf, x, sx, sxf | N Z V C |
0110 1aaa | SUBSP | Subtract from stack pointer (SP) | i, d, n, s, sf, x, sx, sxf | N Z V C |
0111 raaa | ADDr | Add to r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1000 raaa | SUBr | Subtract from r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1001 raaa | ANDr | Operación bit a bit AND a r | i, d, n, s, sf, x, sx, sxf | N Z |
1010 raaa | ORr | Operación bit a bit OR a r | i, d, n, s, sf, x, sx, sxf | N Z |
1011 raaa | CPr | Compara r | i, d, n, s, sf, x, sx, sxf | N Z V C |
1100 raaa | LDr | Carga r de la memoria | i, d, n, s, sf, x, sx, sxf | N Z |
1101 raaa | LDBYTEr | Carga byte r de la memoria | i, d, n, s, sf, x, sx, sxf | N Z |
1110 raaa | STr | Guarda r en la memoria | d, n, s, sf, x, sx, sxf | |
1111 raaa | STBYTEr | Guarda el byte r en la memoria | d, n, s, sf, x, sx, sxf |
Z80, x86 y SPARC tratan la bandera de acarreo como una "bandera prestada" al hacer una resta.
Al restar x - y, si x es menor que y (tratamiento de los dos operandos como sin signo),
la bandera de acarreo se establece porque se había "prestado".
A BRC after a SUBr or CPr instruction is equivalent to "branch if unsigned overflow" in this case.
On other processor families, such as ARM and PowerPC, the carry flag after a subtraction
is set to the adder carry output after computing (x + ~y + 1).
When subtracting x - y, if x is greater than or equal to y (treating both operands as unsigned), the carry flag is set.
A BRC after a SUBr or CPr instruction is equivalent to "branch if not unsigned overflow" in this case.
Previous versions of Pep/8 set the C bit on subtraction according to the first philosophy. However, starting with version 8.1.0, the C bit on subtraction is set according to the second philosophy. This is consistent with the section "The Carry Bit" in Chapter 3, and the adder/subtracter circuit in Figure 10.53 in the text.
En otras familias de procesadores, tales como ARM y PowerPC, la bandera de acarreo después de una sustracción se establece en el sumador de salida después de llevar a la computación (~ x + y + 1). Al restar x - y, si x es mayor o igual a y (tratamiento de los dos operandos como sin signo), se establece la bandera de acarreo. A BRC después de una instrucción SUBR o RCP es equivalente a "deriva cuando se desborda sin firmar" en este caso. Las versiones anteriores de Pep / 8 establece el bit C en la resta de acuerdo con la filosofía primera. Sin embargo, comenzando con la versión 8.1.0, el bit C en la resta se establece de acuerdo con la segunda filosofía. Esto es consistente con la sección "El bit de acarreo" en el Capítulo 3, y el circuito sumador / restador en la Figura 10.53 en el texto.
CPrCPr resta el operando en el Registro y establece los bits de estado sin almacenar
el resultado de la resta.
Mientras no hay desbordamiento cuando los operandos se interpretan como números enteros con signo, el bit N se establece apropiadamente para un
instrucción de ramificación condicional posterior.
Si el resultado de la sustracción produce un desbordamiento y el bit N se establecieron como de costumbre, la subsiguiente instrucción de ramificación condicional
podría ejecutar una rama errónea.
En consecuencia, si el CPr resta desbordamientos de operación y establece el bit V, el bit N se invierte
de su valor normal y no duplica el bit de signo.
Con este ajuste, la operación de comparación se extiende el rango de comparaciones válidas. A pesar de que hay un desbordamiento, el bit N se establece como si no existiera el desbordamiento, de modo que una rama condicional subsiguiente operará como se esperaba.
| Commando de punto/th> | Descripción |
|---|---|
.ADDRSS símbolo | La dirección de un símbolo (dos bytes) |
.ASCII "cadena" | Una cadena de bytes ASCII |
.BLOCK n | Un blogue de n bytes |
.BURN 0xFFFF | Iniciado ROM quemar terminando en 0xFFFF |
Constante .BYTE | El valor de byte (un byte) |
.END | El centinela para el ensamblador |
Constante .EQUATE | Equiparar un símbolo al valor de una constante |
Constante .WORD | El valor de una palabra (dos bytes) |
| Addressing Mode | aaa-field | Letters | Operand |
|---|---|---|---|
| Immediate | 000 | i | OprndSpec |
| Direct | 001 | d | Mem [OprndSpec ] |
| Indirect | 010 | n | Mem [Mem [OprndSpec ] ] |
| Stack-relative | 011 | s | Mem [SP + OprndSpec ] |
| Stack-relative deferred | 100 | sf | Mem [Mem [SP + OprndSpec ] ] |
| Indexed | 101 | x | Mem [OprndSpec + X ] |
| Stack-indexed | 110 | sx | Mem [SP + OprndSpec + X ] |
| Stack-indexed deferred | 111 | sxf | Mem [Mem [SP + OprndSpec ] + X ] |
| Modo de direccionamiento | campo-a | Letras | Operando |
|---|---|---|---|
| Inmediato | 0 | i | OprndSpec |
| Indexado | 1 | x | Mem [OprndSpec + X ] |
| Campo-r- | Registro |
|---|---|
0 | Acumulador, A |
1 | Registro de indice, X |
| Etiqueta | Formato |
|---|---|
#1c | Caracteres de un byte |
#1d | Decimal de un byte |
#2d | Decimal de dos bytes |
#1h | Hexadecimal de un byte |
#2h | Hexadecimal de dos bytes |
#2d4a | Decimal de dos bytes, matriz de cuatro celdas (ejemplo) |
+ o - opcional, seguido por un dígito decimal seguido de cero o más dígitos.
Un entero decimal que se utiliza .BYTE tiene un rando de -128 a 255 bytes, de lo contrario desde -32768 hasta 65535.
Un entero hexadecimal comienza con 0x o 0X seguido de uno o más dígitos hexadecimales (mayúsculas o minúsculas).
Un entero hexadecimal con .BYTE tiene un rango de 0 a FF, de lo contrario de 0 a FFFF.
Un solo caracter está encerrado entre comillas simples, como en 't'.
Una cadena ASCII se encierra entre comillas dobles, como en "Mi cadena".
Un byte arbitrario puede ser incluido en una cadena o un carácter anteponiendo exactamente dos dígitos hexadecimales con \x o \X, como en "Nulo terminado \ x00".
A double quote is included in a string by prefixing it with \, as in "She said, \"Hello\".".
A single quote is included in a character by prefixing it with \, as in '\''.
A backslash character is included in a string or character by prefixing it with \, as in "My bash is \\." and '\\'.
The following letters, when preceded by \, generate non printable charactersb backspace, f form feed, n line feed (new line), r carriage return, t horizontal tab, v vertical tabin string and character constants, as in "\n Starts on a new line." and '\n'.
A backslash character followed by any character other than b, f, n, r, t, v, x, X, ", ', or \ (except for the second of a pair of \s) is an error.
Una comilla doble (") precedida de una barra invertida en un carácter que no es necesario, pero es válido y representa una comilla doble.
Una comilla simple (') precedida de una barra invertida en una cadena que no es necesaria, pero es válido y representa una única cotización.
Una constante utilizado como un especificador operando que ocupa menos de dos bytes se justifican a la derecha en el campo de dos bytes.
Una constante utilizado como un especificador operando que ocupa más de dos bytes es un error.